import axios from 'axios'
import {message,Modal} from 'ant-design-vue'
import Vue from 'vue'
import { get} from 'lodash'
import {dbGet} from "@/libs/db"
import routes from '@/router/index.js'
import {errorCreate, responseError} from './tools'
import url from "@/url.config"
// import cookies from '@/libs/cookies'
// import { from } from 'core-js/fn/array'
/**
 * @description 创建请求实例
 */
const CANCEL_TOKEN = axios.CancelToken;

function createService() {
  // 创建一个 axios 实例

  const service = axios.create({})
  // 请求拦截
  service.defaults.headers.get['content-type'] = 'application/json; charset=UTF-8'
  service.interceptors.request.use(
    config => config,
    error => {
      // 发送失败
      return Promise.reject(error)
    }
  )
  // 响应拦截
  service.interceptors.response.use(
    response => {
      // dataAxios 是 axios 返回数据中的 data
      // const dataAxios = response.data
      // 这个状态码是和后端约定的
      // const { code } = dataAxios
      // console.log(response)
      // 根据 code 进行判断
      if (response.status === 200) {
        // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
        if (response.data.code == 5003) {
          Modal.error({
            title: response.data.errorMessage,
            onOk() {
              routes.push({
                name: "login"
              });
            }
          });
          return;
        }else if(response.data.code == 5002){
          Modal.error({
            title: response.data.errorMessage,
            onOk() {
              routes.push({
                name: "login"
              });
            }
          });
          return;
        }else if(response.data.code == 401){
          Modal.error({
            title: response.data.errorMessage,
            onOk() {
              routes.push({
                name: "login"
              });
            }
          });
          return;
        }else if(response.data.code == 1001){
          message.error(response.data.errorMessage)
          return
        }
        return Promise.resolve(response);
      } else {
        return Promise.reject(response);
        // 有 code 代表这是一个后端接口 可以进行进一步的判断
        // switch (code) {
        //   case 200:
        //     // [ 示例 ] code === 0 代表没有错误
        //     return dataAxios
        //   case 400:
        //     // [ 示例 ] 其它和后台约定的 code
        //     errorCreate(`code:${code} ${dataAxios.message}: ${response.config.url}`)
        //     break
        //   default:
        //     // 不是正确的 code
        //     errorCreate(`${dataAxios.message}: ${response.config.url}`)
        //     break
        // }
      }
    },
    error => {
      const status = get(error, 'response.status')
      console.log(status)
      switch (status) {
        case 400:
          error.message = '请求错误(400)';
          break
        case 401:
          error.message = '未授权，请登录(401)';
          break
        case 403:
          error.message = '拒绝访问(403)';
          break
        case 404:
          error.message = `请求地址出错: ${error.response.config.url}(404)`;
          break
        case 405:
          error.message = `(405)`;
          break
        case 408:
          error.message = '请求超时(408)';
          break
        case 500:
          error.message = '服务器内部错误(500)';
          break
        case 501:
          error.message = '服务未实现(501)';
          break
        case 502:
          error.message = '网关错误(502)';
          break
        case 503:
          error.message = '服务不可用(503)';
          break
        case 504:
          error.message = '网关超时(504)';
          break
        case 505:
          error.message = 'HTTP版本不受支持(504)';
          break
        default:
          break
      }
      if (process.env.NODE_ENV === 'production') {
        error.message = '请求失败！';
      }
      errorCreate(error.message);
      return Promise.reject(error.response)
    }
  )
  return service
}

/**
 * @description 创建请求方法
 * @param {Object} service axios 实例
 */


/**
 * @description 创建请求方法
 * @param {Object} service axios 实例
 */
Vue.prototype.$httpRequestList = [];
function createRequestFunction(service) {
  return function (config) {
    const token = dbGet({
      dbName: 'token'
    })
    const configDefault = {
      headers: {
        Authorization: 'Bearer ' + token,
        "Content-Type": "application/json",
        'Accept': '*/*'
      },
      baseURL: url.ip1,
      timeout: 60000 * 5,
      data: {},
      cancelToken: new CANCEL_TOKEN(c => { //强行中断请求要用到的，记录请求信息
        Vue.prototype.$httpRequestList.push(c);
      })
    }

    return service(Object.assign(configDefault, config))
  }
}

// 用于真实网络请求的实例和请求方法
export const service = createService()
export const request = createRequestFunction(service)
